package com.legendshop.openportal.sdk.model.request;

import com.legendshop.openportal.sdk.annotation.JsonValid;
import com.legendshop.openportal.sdk.model.BaseRequest;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;

import static com.legendshop.openportal.sdk.model.constants.ApiPathConstants.SUBMIT_ORDER;

/**
 * 提交订单
 *
 * @author EDaoren
 */
@Data
@ApiModel("提交订单请求")
public class SubmitOrderRequest extends BaseRequest {

	private static final long serialVersionUID = 1804479605142272211L;

	/**
	 * 非空：是
	 * 第三方的订单单号，必须在30字符以内
	 */
	@ApiModelProperty("第三方的订单单号")
	@NotNull(message = "第三方的订单单号不能为空")
	@Length(max = 30, message = "第三方订单单号要在30字符以内")
	private String thirdOrderNo;

	/**
	 * 非空：是
	 * 下单商品信息 SubmitSku
	 * (最高支持100种商品)
	 */
	@ApiModelProperty(value = "下单商品信息", example = "[{“prodId”:商品编号1,“skuId”:规格编号1,”num”:下单数量1,“price”:商品价格}]")
	@JsonValid(target = SubmitSku.class, isArrayJson = true, arrayMaxSize = 100)
	@NotNull(message = "下单商品信息不能为空")
	private String sku;

	/**
	 * 非空：是
	 * 收货人姓名，最多20个字符
	 */
	@ApiModelProperty("收货人姓名")
	@NotNull(message = "收货人姓名不能为空")
	@Length(max = 20, message = "收货人姓名最多20个字符")
	private String name;

	/**
	 * 非空：是
	 * 收货人手机号，最多20个字符
	 */
	@ApiModelProperty("收货人手机号")
	@NotNull(message = "收货人手机号不能为空")
	@Length(max = 20, message = "收货人手机号最多20个字符")
	private String mobile;

	/**
	 * 非空：是
	 * 一级地址ID：收货人省份地址ID
	 */
	@ApiModelProperty("一级地址ID")
	@NotNull(message = "一级地址ID不能为空")
	private Long province;

	/**
	 * 非空：是
	 * 二级地址ID：收货人市级地址ID
	 */
	@ApiModelProperty("二级地址ID")
	@NotNull(message = "二级地址ID不能为空")
	private Long city;

	/**
	 * 非空：是
	 * 三级地址ID：收货人县（区）级地址ID
	 */
	@ApiModelProperty("三级地址ID")
	@NotNull(message = "三级地址ID不能为空")
	private Long area;

	/**
	 * 非空：是
	 * 四级地址ID：收货人乡镇地址编码(如果该地区有四级地址，则必须传递四级地址，没有四级地址则传0)
	 */
	@ApiModelProperty("四级地址ID")
	@NotNull(message = "四级地址ID不能为空")
	private Long town;

	/**
	 * 非空：是
	 * 收货人详细地址，最多100个字符
	 */
	@ApiModelProperty("收货人详细地址")
	@Length(max = 100, message = "收货人详细地址最多100个字符")
	@NotNull(message = "收货人详细地址不能为空")
	private String address;

	/**
	 * 非空：否
	 * 备注（少于100字）
	 */
	@ApiModelProperty("备注")
	@Length(max = 100, message = "订单备注最多100个字符")
	private String remark;


	@Override
	@ApiModelProperty(hidden = true)
	public String getApiPath() {
		return SUBMIT_ORDER;
	}

	/**
	 * @author EDaoren
	 */
	@Data
	@NoArgsConstructor
	@AllArgsConstructor
	public static class SubmitSku implements Serializable {

		private static final long serialVersionUID = -485399627544222971L;

		/**
		 * 商品ID
		 */
		@ApiModelProperty("商品ID")
		@NotNull(message = "商品ID不能为空")
		private Long prodId;

		/**
		 * skuId
		 */
		@ApiModelProperty("skuId")
		@NotNull(message = "规格ID不能为空")
		private Long skuId;

		/**
		 * 下单数量
		 */
		@ApiModelProperty("下单数量")
		@NotNull(message = "商品数量不能为空")
		private Integer num;

		/**
		 * 非空：否
		 * 商品价格：
		 * 该字段不传值将查询最新的售卖价下单；
		 * 传值时会校验传入价格和当前价格是否相等：如果价格不相等，下单失败。
		 */
		@ApiModelProperty("商品价格")
		private BigDecimal price;
	}

}
